<?php
namespace app\home\controller;

use think\Controller;
use think\Cookie;
use think\Db;

// 引入验证码
use think\captcha\Captcha;

class Index extends Controller
{
    public function __construct()
    {
        // 手动把父类的方法获取过来
        parent::__construct();

        // 在控制器的全局中保留一个全局变量
        // app/common/Model/User/User.php
        $this->UserModel=model('User.User');
        $this->PostModel=model('Post.post');
        $this->CommentModel=model('Post.Comment');
        $this->ConfigModel = model('Config');
        $this->SignModel = model('User.Sign');
        $this->RecordModel = model('User.Record');

        $SystemList = $this->ConfigModel->select();

        $System = [];

        foreach($SystemList as $item)
        {
            $System[$item['key']] = $item;
        }

        //让每个界面都可以获取系统配置
        $this->assign('System', $System);
    }

    // 首页模板
    public function index()
    {
        $cateid=$this->request->param('cateid','');
        $accept=$this->request->param('accept','');
        $keywords=$this->request->param('keywords','');

        // 签到
        $action=$this->request->param('action','');
        $signflag=false;//默认今天没有签到
        $signpoint=0;//记录签到获得的积分
        $success=[
            'result'=>false,
            'msg'=>'',
        ];

        $LoginUser=Cookie::get('LoginUser');

        $userexist=$this->UserModel->where(['id'=>$LoginUser['id']])->find();

        // 当前时间
        $now=getdate();
        $nowstr=date('Y-m-d H:i',$now[0]);

        // 获取今天开始的时间戳
        $todatybegin=strtotime(date('Y-m-d 00:00:00'));
        $where=[
            'createtime'=>['gt',$todatybegin],
            'userid'=>$LoginUser['id'],
            'state'=>4,
        ];

        $todaysign=$this->RecordModel->where($where)->find();

        if($todaysign){
            $signflag=true;
        }

        $usersignnum=$this->RecordModel->where(['userid'=>$LoginUser['id'],'state'=>4])->count();
        $signpoint=5*$usersignnum;
        $usersign=$this->RecordModel->where(['userid'=>$LoginUser['id'],'state'=>4])->select();

        foreach($usersign as $item){
            $item['createtimenum']=strtotime($item['createtime']);
        }

        $signnum=moreSign($usersign,0,$todatybegin,$signflag);
        if($action == 'sign'){
            if(!$userexist){
                $success['result']=false;
                $success['msg']='请登录再签到';
                return json($success);
            }

            if(!$LoginUser){
                $success['result']=false;
                $result['msg']='请先登录再签到';
                return json($success);
            }

            if($todaysign){
                $success['result']=false;
                $result['msg']='今日已签到，无须再签到';
                return json($success);
            }

            // 插入数据库
            // 开启事务
            $this->RecordModel->startTrans();
            $this->UserModel->startTrans();
            
            $recordData=[
                'content'=>"【签到】签到积分：<b>5积分</b> - 签到时间：{$nowstr}",
                'point'=>5,
                'state'=>4,
                'userid'=>$LoginUser['id']
            ];
            $recorState=$this->RecordModel->save($recordData);

            if(!$recorState){
                $success['result']=false;
                $success['msg']='数据插入失败';
                return json($success);
            }

            $userData=[
                'point'=>$userexist['point']+5,
                'id'=>$LoginUser['id'],
            ];
            $userData=$this->UserModel->isUpdate(true)->save($userData);

            if(!$userData){
                $success['result']=false;
                $success['msg']='积分插入失败';
                $this->RecordModel->rollback();
                return json($success);
            }

            if($userData && $recorState){
                $this->RecordModel->commit();
                $this->UserModel->commit();
                $success['result']=true;
                $success['msg']='签到成功';
            }else{
                $this->RecordModel->rollback();
                $this->UserModel->rollback();
                $success['result']=false;
                $success['msg']='签到失败';
            }
            return json($success);
        }



        // 封装条件
        $where=[];

        if($cateid){
            $where['cateid']=$cateid;
        }

        if($accept !== ''){
            // 未结
            if($accept == 0){
                $where['accept']=['exp',Db::raw('is null')];
            }else{
                // 已结束
                $where['accept']=['exp',Db::raw('is not null')];
            }
        }

        // 判断是否有关键词查询
        if(!empty($keywords)){
            $where['title|post.content']=[['like',"%$keywords%"],"OR"];
        }

        // 分页数据查询
        $postlist = $this->PostModel->with(['cate','user'])->where($where)->order('createtime','desc')->paginate(10);
        
        // 调试模型执行的最后一条sql语句
        // echo $this->PostModel->getLastSql();
        // exit;

        // 分页调用
        $pagestr=$postlist->render();
        
        // 查询分类列表
        $catelist=model('Post.Cate')->order('weigh','asc')->limit(6)->select();

        // 查询状态列表
        $posttop=$this->PostModel->where('state','eq','1')->order('createtime','desc')->limit(4)->select();
        $postelite=$this->PostModel->where('state','eq','2')->order('createtime','desc')->limit(6)->select();
        $posthots=$this->PostModel->where('state','eq','3')->order('createtime','desc')->limit(8)->select();

        // 回帖周榜 一条sql语句就可以
        // alias:给表取别名
        // join('user user', 'user.id = comment.userid')
        //       给表取别名
        $grouplist=$this->CommentModel->alias('comment')
            ->field('count(comment.id) AS nums,user.nickname,user.avatar,user.id')
            ->join('user user', 'user.id = comment.userid')
            ->order("nums", "desc")
            ->group('userid')
            ->limit(12)
            ->select();
        // var_dump(collection($grouplist)->toArray());
        // exit;

        $this->assign([
            'cateid'=>$cateid,
            'accept'=>$accept,
            'catelist'=>$catelist,
            'posttop'=>$posttop,
            'postelite'=>$postelite,
            'posthots'=>$posthots,
            'postlist'=>$postlist,
            'pagestr'=>$pagestr,
            'grouplist'=>$grouplist,
            'signnum'=>$signnum,
            'signflag'=>$signflag,
            'signpoint'=>$signpoint,
        ]);

        return $this->fetch();
    }

    // 详细页模板
    public function info(){
        $postid=$this->request->param('postid',0);

        // 获取点击分类的id
        $cateid=$this->request->param('cateid',0);
        $accept=$this->request->param('accept','');

        // 查询帖子信息
        $post=$this->PostModel->with(['cate','user'])->find($postid);

        if(!$post){
            $this->error('悬赏帖子未找到，请重新选择',url('home/index/index'));
            exit;
        }

        // 查询评论总数
        $count=$this->CommentModel->where(['postid'=>$postid])->count();

        // 访问量 字符串转换成数组
        $visit=trim($post['visit']);
        $VisitArr=explode(',',$visit);//转换为数组
        $VisitArr=array_filter($VisitArr);//去除数组中的空元素
        $VisitCount=is_array($VisitArr) ? count($VisitArr) : 0;

        // 判断是否有登录
        $User=empty(Cookie::get('LoginUser')) ? [] :Cookie::get('LoginUser');
        $userid=isset($User['id']) ? $User['id'] : 0;
        $User=$this->UserModel->find($userid);

        // 收藏的状态
        $CollectStatus=false;

        if($User){
            $collect=model('User.Collect')->where(['userid'=>$User['id'],'postid'=>$postid])->find();

            // 如果查出来有，就说明有收藏
            $CollectStatus=$collect ? true : false;

            // 判断这个人是否访问过，没有访问过的话，要加上这个人的id 就代表访问过了
            // 当前这个人没访问过
            if(!in_array($User['id'],$VisitArr)){
                $VisitArr[]=$User['id'];

                // 组装数据
                $data=[
                    'id'=>$post['id'],//一定要有id
                    'visit'=>implode(',',$VisitArr),//数组转换为字符串
                ];

                // 更新语句
                $this->PostModel->isUpdate(true)->save($data);
            }
        }

        $commentlist=$this->CommentModel->with(['user'])
                                        ->where(['postid'=>$postid])
                                        ->order('id','asc')
                                        ->order('level','asc')
                                        ->select();

        $commentlist=CommentTree($commentlist,0,$User);

        // if($commentlist){
        //     // 重新修改一些字段
        //     foreach($commentlist as $item){
        //         // 当like不为空就说明人点赞了
        //         if(!empty($item['like'])){
        //             // 字符串转数组
        //             $LikeArr=explode(',',$item['like']);
        //             $LikeArr=array_filter($LikeArr);//去除数组中的空元素
        //             $LikeCount=is_array($LikeArr) ? count($LikeArr) : 0;

        //             $item['like_count']=$LikeCount;

        //             // 判断当前这一条评论是不是本人点赞过
        //             // $user['id']
        //             // $LikeArr
        //             if(in_array($User['id'],$LikeArr)){
        //                 $item['active']=true;
        //             }else{
        //                 $item['active']=false;
        //             }
        //         }else{
        //             // 当like字段为空
        //             $item['like_count']=0;
        //         }
        //     }
        // }

        // 查询分类列表
        $catelist=model('Post.Cate')->order('weigh','asc')->limit(6)->select();
        
        $posthots=$this->PostModel->where('state','eq','3')->order('createtime','desc')->limit(8)->select();

        $this->assign([
            'cateid'=>$cateid,
            'accept'=>$accept,
            'catelist'=>$catelist,
            'posthots'=>$posthots,
            'post'=>$post,
            'CollectStatus'=>$CollectStatus,
            'count'=>$count,
            'VisitCount'=>$VisitCount,
            'commentlist'=>$commentlist,
        ]);

        return $this->fetch();
    }
    // 注册模板
    public function reg(){
        // 判断是否有登录
        $LoginUser=Cookie::get('LoginUser');

        if(!empty($LoginUser)){
            // 查出来是否正确
            $id=isset($LoginUser['id']) ? $LoginUser['id'] : 0;

            // 根据id去查询用户
            $user=$this->UserModel->find($id);

            if($user){
                // 直接跳转到会员中心
                $this->success('您已登录，无须重复登录',url('home/user/index'));
                exit;
            }
        }

        // 判断是否有post数据
        if($this->request->isPost()){
            //  获取所有的post数据
            $params=$this->request->param();

            // 获取参数 如果没有就默认为空
            $vercode=$this->request->param('vercode','');

            // 判断验证码是否正确 如果结果返回true就是正确 否则失败
            if(!captcha_check($vercode)){
                $this->error('验证码输入错误',null,'',100);
                exit;
            }

            $password=$this->request->param('password','');
            $repass=$this->request->param('repass','');

            if($password != $repass){
                $this->error('密码和确认密码不一致');
                exit;
            }

            // 生成密码盐
            $salt=randstr(10);

            // 将密码和密码盐md5加密
            $password=md5(trim($password).$salt);

            // 获取系统配置表里面的赠送积分
            $RegisterPoint=model('Config')->where(['key'=>'RegisterPoint'])->value('value');

            // 判断一下注册积分 是不是一个整体
            $RegisterPoint=is_numeric($RegisterPoint) ? abs($RegisterPoint) : 0;

            // 组装数据
            $data=[
                'email'=>$params['email'],
                'password'=>$password,
                'salt'=>$salt,
                'nickname'=>$params['nickname'],
                'point'=>$RegisterPoint,
                'vip'=>0,
                'auth'=>0
            ];

            // 开始插入数据库
            $result=$this->UserModel->validate('common/User/User')->save($data);

            if($result===FALSE){
                // 注册失败
                // getError 返回操作的结果
                $this->error($this->UserModel->getError());
                exit;
            }else{
                // 注册成功，跳转到登录界面
                $this->success('注册成功',url('home/index/login'));
                exit;
            }
        }

        return $this->fetch();
    }

    // 登录模板
    public function login(){
        $LoginUser=Cookie::get('LoginUser');

        if(!empty($LoginUser)){
            $id=isset($LoginUser['id']) ? $LoginUser['id'] : 0;

            $user=$this->UserModel->find($id);

            if($user){
                $this->success('您已登录，无须重复登录',url('home/user/index'));
                exit;
            }
        }

        // 判断是否有post数据
        if($this->request->isPost()){
            // 获取所有数据
            $params=$this->request->param();

            // 验证码是否正确
            // 获取参数 如果没有就默认为空
            $vercode=$this->request->param('vercode','');

            if(!captcha_check($vercode)){
                $this->error('验证码输入错诶');//,null,'',100
                exit;
            }

            $email=$this->request->param('email','');
            $password=$this->request->param('password','');

            // 查询toArray 转换为数组
            $User=$this->UserModel->where(['email'=>$email])->find();

            // 当没有找到用户的情况
            if(!$User){
                $this->error('用户不存在，请重新输入');
                exit;
            }

            // 判断密码
            $salt=$User['salt'];

            // 要让你密码夹密否进行对比
            $password=md5(trim($password).$salt);

            if($password != $User['password']){
                $this->error('密码输入错误');
                exit;
            }

            // 设置一个保存cookie信息
            $data=[
                'id'=>$User['id'],
                'nickname'=>$User['nickname'],
                'vip'=>$User['vip'],
                'auth'=>$User['auth'],
                'avatar'=>is_file($User['avatar']) ? '/'.$User['avatar'] : '/assets/home/images/avatar.jpg',
                'cover'=>is_file($User['cover']) ? '/'.$User['cover'] : '/assets/home/images/back.jpg'
            ];

            // 将用户信息设置到cookie里面
            Cookie::set('LoginUser',$data);

            $this->success('登录成功',url('home/index/index'));
            exit;
        }

        return $this->fetch();
    }

    // 退出界面
    public function logout(){
        // 删除cookie
        Cookie::delete('LoginUser');
        // 提醒
        $this->success('退出成功',url('home/index/login'));
        exit;
    }

    // 验证码
    public function captcha(){
        // 使用thinkPHP自带的
        // 配置
        ob_clean();
        $config=[
            // 'useZh'=>true,//设置字体为中文
            'length'=>4,//设置字符长度为4
        ];

        $captcha=new Captcha($config);
        return $captcha->entry();
    }

    // 邮箱验证
    public function email(){
        // 把用户表里面所有的人全部找出来挨个md5加密，只要是有一个跟他参数一样的就说明有这个人

        // 获取参数
        $auth=$this->request->param("email",'');

        if(empty($auth)){
            $this->error('验证的邮箱参数有误，请重新验证','login.php');
            exit;
        }

        $userlist=$this->UserModel->field('id,email')->select();

        // 用户id
        $userid=0;

        foreach($userlist as $item){
            // md5加密
            $email=md5($item['email']);

            // 如果加密结果是一样的就说明有找到人
            if($email==$auth){
                $userid=$item['id'];
                break;
            }
        }

        // 判断是否有找到人
        if(!$userid){
            $this->error('未找到需要验证的邮箱用户，请查验后重新验证');
            exit;
        }

        // 组装数据
        $data=[
            'id'=>$userid,
            'auth'=>1,
        ];

        // 更新方法
        $result=$this->UserModel->isUpdate(true)->save($data);

        if($result===FALSE){
            $this->error('邮箱验证失败',url('home/user/profile'));
            exit;
        }else{
            $this->success('邮箱验证成功',url('home/user/profile'));
            exit;
        }
    }

    public function sign(){
        // 判断是否有登录
        $LoginUser=Cookie::get('LoginUser');

        if(!empty($LoginUser)){
            // 查出来是否正确
            $userid=isset($LoginUser['id']) ? $LoginUser['id'] : 0;

            // 根据id去查询用户
            $user=$this->UserModel->find($userid);

            if(!$user){
                $this->error('您未登录，请先登录再签到',url('home/index/login'));
                exit;
            }
        }

        $success=[
            'result'=>false,
            'msg'=>''
        ];

        if($this->request->isPost()){
            //  获取所有的post数据
            $params=$this->request->param();
            
            $datas=$this->SignModel->where(['userid'=>$userid])->select();
            
            // 看当前的用户id在sign表里有没有数据，没有就直接添加一条新数据
            if(count($datas) == 0){
                // $query=$this->SignModel->insert(['signtime'=>date('Y-m-d H:i:s'),'userid'=>$userid]);
                $data=[
                    'point'=>3,
                    'userid'=>$userid,
                    'state'=>1
                ];
                $addsign = $this->SignModel->save($data);

                if($addsign === FALSE){
                    //添加失败
                    $success['result'] = false;
                    $success['msg'] = $this->SignModel->getError();
                    return json($success);
                }else{
                    $success['result'] = true;
                    $success['msg'] = '签到成功';
                    return json($success);
                }
                // $this->success('签到成功');//签到成功并返回首页

            }else{

                // 开始时间
                $startDay=date('Y-m-d',"00:00:00");
                // 结束时间
                $endDay=date('Y-m-d',"23:59:59");

                // 查询signtime在不在开始时间到结束时间之间
                $isexit = $this->SignModel->field('signtime')->where(['userid'=>$userid])->where('signtime','between',[$startDay,$endDay])->select();
                
                // 如果查询出来有一条数据，证明已签到，无需再签到
                if(count($isexit)==1){
                    $this->error('今日已签到，无需再签到');
                    exit;
                }else{
                    // $query=$this->SignModel->insert(['signtime'=>date('Y-m-d H:i:s'),'userid'=>$userid]);
                    $data=[
                        'point'=>3,
                        'userid'=>$userid,
                        'state'=>1
                    ];
                    $Addsign = $this->SignModel->save($data);

                    if($Addsign === FALSE){
                        //添加失败
                        $success['result'] = false;
                        $success['msg'] = $this->SignModel->getError();
                        return json($success);
                    }else{
                        $success['result'] = true;
                        $success['msg'] = '签到成功';
                        return json($success);
                    }
                    // $this->success('签到成功');//签到成功并返回首页
                }
            }
        }
    }
}

